/**
*
*
*\author Isabel Martín Herrero 48539974S
*
*
**/

#include <string>
#include <vector>
#include "IDibujable.h"
#include "Figura2D.h"

/**
*\file GrupoFiguras.h
*\brief Archivo .h de la clase GrupoFiguras
*Archivo que contiene la declaración la clase GrupoFiguras
*
**/


#ifndef MAMELFO_H
#define MAMELFO_H

#include "Circulo.h"
#include "Rectangulo.h"
using namespace std;

/** \brief Clase GrupoFiguras
 *
 * La clase GrupoFiguras permite hacer operaciones con grupos de figuras.
 * La clase GrupoFiguras hereda de IDibujable
 */

class GrupoFiguras:public IDibujable
{
	private:
		/** \brief Miembro descripcion de la clase GrupoFiguras
		*
		* descripcion, de tipo string. Contiene la descripcion del grupo
		*/
		string descripcion;
		
		/** \brief Miembro vector Figuras2D*
		*Vector de figuras2D;
		*/
		vector<Figura2D*> figs;
				
	public:
		/** \brief Contructor de la clase GrupoFiguras
		*
		* Crea un objeto de tipo GrupoFiguras. 
		*/
		GrupoFiguras(const vector<Figura2D*>&  ,string = "");


		/** \brief Destructor de la clase GrupoFiguras
		*
		* Libera la memoria ocupada por un objeto de tipo GrupoFiguras
		*/
		~GrupoFiguras();
		
		/** \brief Constructor copia de GrupoFiguras
		*
		* Crea un objeto de tipo GrupoFiguras con los atributos al mismo valor que el que se le pasa como parámetro.
		*/ 
		GrupoFiguras(const GrupoFiguras&);
		
		
		/** \brief Método setDescripcion.
		*
		* Asigna una descripción a un grupo de figuras
		* \param d String con la descripcion
		* \return Devuelve void
		*/
		void setDescripcion(string d){descripcion=d;};


		/** \brief Método getDescripcion
		*
		* Devuelve la descripción del grupo de figuras
		* \return Devuelve una cadena con la descripcion
		*/
		string getDescripcion() const{return descripcion;};
	
		/** \brief Método getNumFiguras
		*
		* Devuelve el numero de figuras que componen el grupo
		* \return Devuelve un entero.
		*/
		int getNumFiguras()const {return (int)figs.size();};	
		/** \brief Método pintar.
		*
		* Devuelve la representacion las figuras en SVG
		* \param os Objeto de flujo de salida
		* \return Devuelve void
		*/
		void pintar(ostream& os)const;


		/** \brief Método puedoPintarme
		*
		* Devuelve true si puede pintarse de forma individual
		* \return Devuelve bool
		*/
		bool puedoPintarme() const;


		/** \brief Método leeEntrada.
		*
		* Lee los parámetros necesarios para crear una figura desde el flujo de entrada is
		* \param is Toma como parametro un objeto de tipo flujo de entrada.
		* \return Devuelve void.
		*/
		void leeEntrada(istream& is);

		/** \brief Método getFigura.
		*
		* Devuelve un puntero a la i-esima figura del grupo. Si no existe, devuelve NULL
		* \return Devuelve un objeto Figura2D.
		*/
		Figura2D& getFigura(int ) const;


		/** \brief Método mover.
		*
		* Mueve las figuras del grupo
		* \param c Nuevo origen .
		* \return Devuelve el origen anterior.
		*/
		Coordenada mover(const Coordenada& c);


		/** \brief Método getOrigen.
		*
		* Devuelve la coordenada origen
		* \return Devuelve una coordenada.
		*/
		Coordenada getOrigen()const;


		/** \brief Método escalar.
		*
		* Escala un grupo de figuras respecto a un porcentaje que se pasa por parametro
		* \return Devuelve void.
		*/
		void escalar(float = 100);
		
		/** \brief Método clonar.
		* clonar ^_^ 
		* \return Devuelve la copia del GrupoFiguras.
		*/
		GrupoFiguras* clonar() const;
		
		/** \brief Método duplicar.
		*
		* duplica ^_^ 
		* \param nuevoOrigen
		* \return Devuelve la copia del GrupoFiguras.
		*/
		GrupoFiguras* duplicar (const Coordenada& nuevoOrigen);
		
		/** \brief Método ocultar.
		* \return Oculta un grupo
		*/
		virtual void ocultar(bool = false);
		
		/** \brief Método isOculto.
		* \return Retorna si la figura esta o no oculta
		*/
		virtual bool isOculto() const;
};


#endif
